#ifndef UTILS_H
#define UTILS_H
#include "Utils.h"
#include <QString>
#include <QRegExp>
#include <QMessageBox>
#include <QSpacerItem>
#include <QGridLayout>
#include <QSqlQuery>
#include <QDebug>

bool emailEsValido(QString email)
{
    QString patronEmail = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    QRegExp rx(patronEmail);
    return rx.exactMatch(email);
}

bool telefonoEsValido(QString telefono)
{
    QString patronTelefono= "[0-9]{3,4}-[0-9]{3}-[0-9]{3}";
    QRegExp rx(patronTelefono);
    return rx.exactMatch(telefono);
}

// Verifica que el formato del RUC sea válido.
bool patronRucEsValido(QString ruc)
{
    QString patronRuc = "[0-9]{6,8}-[0-9]{1}";
    QRegExp rx(patronRuc);
    return rx.exactMatch(ruc);
}

// Cálculo de Dígito Verificador del RUC.
int calcular_DV_RUC(const QString *ruc, int base)
{
    // CALCULO Digito verificador - RUC

    int v_total, v_resto, k, v_numero_aux, v_digit;
      QString v_numero_al = "";

      for (int i = 0; i < ruc->length()-2; i++) {
        QChar c = ruc->at(i);
        if(c.isDigit()) {
          v_numero_al += c;
        } else {
          v_numero_al += c.digitValue();
        }
      }

      k = 2;
      v_total = 0;

      for(int i = v_numero_al.length() - 1; i >= 0; i--) {
        k = k > base ? 2 : k;
        v_numero_aux = v_numero_al.at(i).digitValue();
        v_total += v_numero_aux * k++;
      }

      v_resto = v_total % 11;
      v_digit = v_resto > 1 ? 11 - v_resto : 0;

      qDebug() << "Digito Verificador Calculado :" + QString::number(v_digit);
      return v_digit;
}

bool rucEsValido(QString ruc)
{
    int digitoVerificador = calcular_DV_RUC(&ruc, 11);
    int i = ruc.length()-1;
    QChar ultimoDigito = ruc.at(i);

    if (!patronRucEsValido(ruc) || digitoVerificador != ultimoDigito.digitValue())
    {
        return false;
    }

    return true;
}

//Constantes QMessageBox
//1. error
//2. pregunta (con botones si y no)
//3. advertencia
//4. info (por defecto)


int cuadroMensaje(QString titulo, QString mensaje, QString icono = "info")
{

    QMessageBox m;

    m.setText("<p align=center>" + titulo + "</p>");
    m.setInformativeText("<p align=justify>" +mensaje + "</p>");


    if(icono == "error") m.setIcon(QMessageBox::Critical);

    else if(icono == "pregunta"){

        m.setIcon(QMessageBox::Question);
        m.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
    }

    else if(icono == "advertencia"){
        m.setIcon(QMessageBox::Warning);
        m.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
    }

    else m.setIcon(QMessageBox::Information);

    QSpacerItem* horizontalSpacer = new QSpacerItem(350, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
    QGridLayout* layout = (QGridLayout*)m.layout();
    layout->addItem(horizontalSpacer, layout->rowCount(), 0, 1, layout->columnCount());

    return m.exec();
}

bool numeroFacturaEsValido(QString numeroFactura)
{
    QString patronFactura = "[0-9]{3}-[0-9]{3}-[0-9]{8}";
    QRegExp rx(patronFactura);
    return rx.exactMatch(numeroFactura);
}


bool existeEnLaBD(QString tabla, QString campo, QString valor)
{
    QSqlQuery query;
    query.exec("Select 1 from " + tabla + " where " + campo + " ='" + valor +"'");
    return query.size() > 0 ? true : false;
}

#endif // UTILS_H
